/*
 * Copyright 北京航空航天大学 @ 2015 版权所有
 */
package com.buaa.edu.leetcode.algorithm.stack;

import java.util.Stack;

/**
 * <p>
 * 简化Linux文件路径
 * 
 * 例如 path = "/home/", => "/home" path = "/a/./b/../../c/", => "/c"
 * </p>
 * 
 * @author towan
 * @email tongwenzide@163.com 2015年5月24日
 */
public class SimplifyPath {
    // 将输入字符串以斜杠进行分割成数组，从头扫描该数组，忽略空串和.，遇到..则弹出栈顶，其他情况压入栈

    public String simplifyPath(String path) {
        if (path == null || path.isEmpty()) {
            return "/";// 根路径和
        }
        Stack<String> stack = new Stack<String>();
        String[] split = path.split("/");
        for (String s : split) {
            if (s == null || s.isEmpty() || s.equals(".")) {
                // 忽略
            } else if (s.equals("..")) {
                // 弹出栈
                if (stack.size() > 0) {
                    stack.pop();
                }
            } else {
                // 压入栈
                stack.push(s);
            }
        }
        // 空就返回
        if (stack.isEmpty()) {
            return "/";
        }
        StringBuffer sb = new StringBuffer();
        while (!stack.isEmpty()) {
            sb.insert(0, stack.pop());
            sb.insert(0, "/");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(new SimplifyPath().simplifyPath("/home/"));
        System.out.println(new SimplifyPath().simplifyPath("/a/./b/../../c/"));
    }
}
